我有一个称为文件example_file.py
,我想从其他各种文件使用,所以我决定加入example_file.py
到sys.path
与导入该文件在其他文件中使用的文件.为此,我运行了以下内容sys.path
.
import sys
sys.path
sys.path.append('/path/to/the/example_file.py')
print(sys.path)
Run Code Online (Sandbox Code Playgroud)
我可以看到我刚刚添加的路径,当我尝试从另一个目录路径导入此文件时,如下所示:
import example_file
Run Code Online (Sandbox Code Playgroud)
它工作得很好,但是一旦我出来example_file.py
,再次进入,并检查了example_file.py
,我看到我添加的路径不存在,所以任何人都可以让我知道如何永久地添加到sys.path的路径蟒蛇.预先感谢您的帮助.
另一位开发人员和我不同意是否应该使用PYTHONPATH或sys.path来允许Python在用户(例如,开发)目录中查找Python包.
我们有一个具有典型目录结构的Python项目:
Project
setup.py
package
__init__.py
lib.py
script.py
Run Code Online (Sandbox Code Playgroud)
在script.py中,我们需要这样做import package.lib
.当软件包安装在site-packages中时,script.py可以找到package.lib
.
但是,当从用户目录工作时,还需要做其他事情.我的解决方案是将我的PYTHONPATH设置为包含"〜/ Project".另一位开发人员希望将这行代码放在script.py的开头:
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
Run Code Online (Sandbox Code Playgroud)
这样Python就可以找到本地副本了package.lib
.
我认为这是一个坏主意,因为这行只对开发人员或从本地副本运行的人有用,但我不能说明为什么这是一个坏主意.
我们应该使用PYTOHNPATH,sys.path,还是要么?
我想从Python脚本中获取当前目录的父级.例如,我/home/kristina/desire-directory/scripts
在这种情况下从欲望路径启动脚本/home/kristina/desire-directory
我知道sys.path[0]
从sys
.但我不想解析sys.path[0]
结果字符串.有没有其他方法可以在Python中获取当前目录的父级?
在我的系统上,我有多次安装了几个模块.举个例子,numpy 1.6.1
安装在标准路径中/usr/lib/python2.7/dist-packages
,我有一个numpy 1.8.0
安装的更新版本/local/python/lib/python2.7/site-packages/
.
我不能简单地删除旧版本的原因是我没有权限在我的工作计算机上更改任何内容.但是我需要使用新的numpy版本.
我加入/local/python/lib/python2.7/site-packages/
了我的PYTHONPATH
.不幸的是,这没有用,因为/usr/lib/python2.7/dist-packages
首先插入到路径中,因此numpy 1.6.1
将被加载.这是一个例子:
>>> import os
>>> print os.environ['PYTHONPATH']
/local/python/lib/python2.7/site-packages
>>> import pprint
>>> import sys
>>> pprint.pprint(sys.path)
['',
'/local/python/lib/python2.7/site-packages/matplotlib-1.3.1-py2.7-linux-x86_64.egg',
'/local/python/lib/python2.7/site-packages/pyparsing-2.0.1-py2.7.egg',
'~/.local/lib/python2.7/site-packages/setuptools-3.4.4-py2.7.egg',
'~/.local/lib/python2.7/site-packages/mpldatacursor-0.5_dev-py2.7.egg',
'/usr/lib/python2.7/dist-packages',
'/local/python/lib/python2.7/site-packages',
'/usr/lib/python2.7',
...,
'~/.local/lib/python2.7/dist-packages',
...]
Run Code Online (Sandbox Code Playgroud)
所以,似乎导入订单是
PYTHONPATH
~/.local/lib/python2.7/site-packages/*.egg
)~/usr/lib/python2.7/dist-packages/
)PYTHONPATH
~/.local/lib/python2.7/site-packages/
)我的问题是我需要在项目3和项目4之前放置项目5.以使我的代码正常工作.现在,如果我numpy 1.8.0
从/local/*
目录导入一个编译过的模块,并且这个模块导入numpy,它仍然会从/usr/*
目录中取出numpy 并失败.
我通过在我的脚本中放置这样的东西来规避这个问题:
import sys
sys.path.insert(0, '/local/python/lib/python2.7/site-packages/')
Run Code Online (Sandbox Code Playgroud)
因此,我可以强制Python使用正确的导入顺序,但当然这不是一个解决方案,因为我必须在每个脚本中 …
我想,以确保os.environ
和sys.path
是我们开始Python解释所有的方式相同:
有没有一种常见的解决方法?
如果是,那很好:它看起来怎么样?
如果不,那么伤心:每个人都自己解决这个问题.......解决这个问题的好方法是什么?
操作系统:Linux(支持systemd)
更新
更明确:
sys.path
在Web请求,cron作业,从shell启动的python中都是一样的,...os.environ
在Web请求,cron作业,从shell启动的python中都是一样的,...UPDATE2
对于systemd,我们使用EnvironmentFile
UPDATE3
我们使用virtualenv
刚才事情很好.我不知道我做了什么来惹恼virtualenv,但现在它的行为非常奇怪.任何帮助表示赞赏.
在制作virtualenv时,我使用以下命令:
virtualenv -p /usr/bin/python3 venv
Run Code Online (Sandbox Code Playgroud)
现在我看到我安装的软件包pip install package
没有被python加载.它们通过pip正确安装到venv/lib/python3.4/site-packages目录中,但是我的virtualenv中的python没有查看该目录中的包.
在Python中:
import sys
sys.path
['', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']
Run Code Online (Sandbox Code Playgroud)
这是错的!它使用了错误的路径,至少应该包括
/myhomedir/venv/lib/python3.4/site-packages
Run Code Online (Sandbox Code Playgroud)
所以我可以导入我的包.
事实上,在Python中打开了一个virtualenv:
import sys
sys.path.append("/myhomedir/venv/lib/python3.4/site-packages")
import package
Run Code Online (Sandbox Code Playgroud)
作品!!
但我不希望每次使用Python时都手动附加此路径.我做了一些让sys.path非常生气的事情,我不知道那是什么.
我只是sudo apt-get updated和sudo apt-get升级以确保它不是冲突......没有骰子.
可能相关:
我注意到我的virtualenv命令输出以下行:
Using base prefix '/usr'
Run Code Online (Sandbox Code Playgroud)
我不记得以前发生过这种情况.但即使我这样做virtualenv venv
,(没有指定Python版本,并且没有出现输出)我的sys.path仍然是错误的,并且包不会加载.
任何想法?非常感谢帮助.
我已经尝试将以下行添加到我的处理程序脚本(main.py),但它似乎不起作用:
sys.path.append( '子目录')
subdir
住在我的根目录(即包含的目录app.yaml
)中.
这似乎不起作用,因为当我尝试导入生活的模块时subdir
,我的应用程序爆炸了.
Here is my directory structure:
/home/dmugtasimov/tmp/name-res
root
tests
__init__.py
test_1.py
__init__.py
classes.py
extra.py
root.py
Run Code Online (Sandbox Code Playgroud)
File contents: root/tests/_init_.py
import os, sys
ROOT_DIRECTORY = os.path.abspath(os.path.join(os.path.dirname(__file__),
'../..'))
if not sys.path or ROOT_DIRECTORY not in sys.path:
sys.path.insert(0, ROOT_DIRECTORY)
# These imports are required for unittest to find test modules in package properly
from root.tests import test_1
Run Code Online (Sandbox Code Playgroud)
root/tests/test_1.py
import unittest
from root.classes import Class1
class Tests(unittest.TestCase):
pass
Run Code Online (Sandbox Code Playgroud)
root/_init_.py - empty
root/classes.py
import os, sys
ROOT_DIRECTORY = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
if not sys.path …
Run Code Online (Sandbox Code Playgroud) 我在作为用户执行脚本期间安装了一些软件包.这些包是第一个用户包,所以python没有添加~/.local/lib/python2.7/site-packages
到sys.path
之前的脚本运行.我想导入这些已安装的软件包.但我不能,因为他们不在sys.path
.
我怎么刷新sys.path
?
我正在使用python 2.7.
由于我设法解决的一个特定问题,我今天花了大部分时间来弄清楚site.py是如何工作的.有一点我不明白.
据我所知,当加载python时,首先lib/python2.7/site-packages/site.py
运行.它会过去PYTHONPATH
,搜索lib/python2.7/site.py
并导入它.此文件具有以下addsitedir
方法:不仅可以添加路径sys.path
,还可以处理*.pth
存在于其中的文件.此时,main()
来自lib/python2.7/site.py
运行,并addsitedir
在站点包和用户站点包上运行.
现在是奇怪的部分.现在我们回到lib/python2.7/site-packages/site.py
,它遍历pythonpath中的每条路径,并addsitedir
在其上运行.我觉得这很奇怪有两个原因:
addsitedir
跑了lib/python2.7/site-packages
两次.lib/python2.7/site.py
有一种机制允许雄心勃勃的用户sys.path
通过实现一个usercustomize
模块进行操作(嘿,它甚至在文档中).显然,当您实现这样的机制时,您希望确保用户最后进入,这样他就可以控制添加的所有内容sys.path
.但这不是这种情况(因为我很难找到).最有可能的是,第二次调用lib/python2.7/site-packages
将覆盖所有内容usercustomize
.我知道这很糟糕,但我添加了一个打印声明addsitedir
,打印它收到的路径,所以我可以显示正在发生的事情.这些是处理的路径:
/home/user/.local/lib/python2.7/site-packages #lib/python2.7/site.py
/home/user/py/lib/python2.7/site-packages #lib/python2.7/site.py
#This is where your usercustomize runs
#Followin calls are from lib/python2.7/site-packages/site.py
/home/user/py/lib/python2.7/site-packages/numpy-1.9.0-py2.7-linux-x86_64.egg
/home/user/Develop/Python/myproject
/home/user/lmfit-0.7.2
/home/user/py/lib/python2.7/site-packages #NOTE: this runs a second time
Run Code Online (Sandbox Code Playgroud)
那我在这问什么呢?:)
答:我很欣赏为什么需要第二次调用site-packages的见解.
B. usercustomize
确实有限,因为我认为这是由于这种实施?考虑到这一点,你如何实现从sys.path中删除 …
python ×10
sys.path ×10
module ×2
python-2.7 ×2
pythonpath ×2
django ×1
import ×1
linux ×1
package ×1
packages ×1
reload ×1
sys ×1
ubuntu ×1
versions ×1
virtualenv ×1